package controllers;

import java.util.ArrayList;
import java.util.List;
import java.util.Set;

import models.Jogador;
import play.data.Form;
import play.mvc.Controller;
import play.mvc.Result;
import play.mvc.Security;
import dao.DAOJogador;
import views.*;


public class JogadorController extends Controller {
	private static Form<Jogador> formJogador = new Form<Jogador>(Jogador.class);

	@Security.Authenticated(Seguranca.class)
	public static Result index() {
		DAOJogador dao = new DAOJogador();
		try {
			return ok(views.html.jogador.index.render(dao.select()));		
		} catch (Exception e) {
			e.printStackTrace();
			return ok(e.getMessage());
		}


	}

	public static Result cadastrarView(){
		formJogador = new Form<Jogador>(Jogador.class);
		System.out.println("\n\n\nessa mensgam aqui\n\n\n\n");
		return ok(views.html.jogador.cadastrar.render(formJogador, ""));
	}

	@Security.Authenticated(Seguranca.class)
	public static Result editarView(int id){
		DAOJogador dao = new DAOJogador();
		try{
			Jogador u = new Jogador();
			u = dao.select(id);
			return ok(views.html.jogador.editar.render(u));
		}catch(Exception e){
			return internalServerError("Erro ao visualizar Jogador.");
		}
	}

	@Security.Authenticated(Seguranca.class)
	public static Result listarView() {
		DAOJogador dao = new DAOJogador();
		try {
			Set<Jogador> jogadores = dao.select();
			return ok(views.html.jogador.listar.render(jogadores));
		} catch (Exception e) {
			return internalServerError("Erro ao visualizar Jogadores.");
		}

	}

	public static Result cadastrar(){
		if(session()!=null){
			Form<Jogador> novoJogador = formJogador.bindFromRequest();


			//System.out.println("\n\n\n"+ jogador +"\n\n\n");
			//Jogador.inserir(Jogador);
			if(novoJogador.hasErrors()){
				return ok (views.html.jogador.cadastrar.render(novoJogador, "Dados inválidos"));
			}

			Jogador jogador = (Jogador)novoJogador.get();
			DAOJogador dao = new DAOJogador();
			try{
				dao.insert(jogador);
				jogador.senha = "";
				return ok(views.html.index.render("Cadastro efetuado com sucesso!", jogador, "alert alert-success"));

			}catch(Exception e){
				return ok(views.html.jogador.cadastrar.render(formJogador, "Erro ao cadastrar jogador!"));
			}
		} else {
			return redirect(routes.Application.index());
		}

	}

	@Security.Authenticated(Seguranca.class)
	public static Result editar(){
		if(session()!=null){
			Form<Jogador> novoJogador = formJogador.bindFromRequest();

			if (novoJogador.hasErrors()) {

				//return ok(views.html.jogador.editar.render(u));
			}

			Jogador Jogador = novoJogador.get();
			DAOJogador dao = new DAOJogador();
			try{
				dao.update(Jogador);
				//return ok("Jogador atualizado!");
				return ok(views.html.jogador.index.render(dao.select()));

			}catch(Exception e){
				e.printStackTrace();
				return internalServerError("Erro ao editar Jogador.");
			}
		}else {
			return redirect(routes.Application.index());
		}

	}

	@Security.Authenticated(Seguranca.class)
	public static Result remover(){
		if(session()!=null){
			Form<Jogador> novoJogador = formJogador.bindFromRequest();
			Jogador Jogador = novoJogador.get();
			DAOJogador dao = new DAOJogador();
			try{
				dao.delete(Jogador);
				return ok("Jogador removido!");
			}catch(Exception e){
				e.printStackTrace();
				return internalServerError("Erro ao remover Jogador.");
			}
		}
		else {
			return redirect(routes.Application.index());
		}
	}

	public static Result autenticar() {

		Form<Jogador> novoJogador = formJogador.bindFromRequest();

		Jogador jogador = new Jogador();

		if (novoJogador.hasErrors()) {
			return ok(views.html.index.render("Erro autenticacao: email e/ou senha invalido.", jogador, "alert alert-error"));
		}

		jogador = novoJogador.get();
		Jogador jBD;

		DAOJogador dao = new DAOJogador();

		try{

			jBD = dao.autenticar(jogador);
			System.out.println(jBD);

			if (jBD != null) {
				session("email", jBD.email);
				session("nome", jBD.nome);
				session("id_jogador", String.valueOf(jBD.idJogador));

				return index();
			}
			jogador.senha = "";
			return ok(views.html.index.render("Erro autenticacao", jogador, "alert alert-error"));
		}catch(Exception e){
			e.printStackTrace();
			return internalServerError("Erro ao buscar Jogador.");
		}
	}

	@Security.Authenticated(Seguranca.class)
	public static Result selecionar(String id) {
		if(session()!=null){
			DAOJogador daoJogador = new DAOJogador();
			try {
				Jogador usu = daoJogador.select(Integer.parseInt(id));
				session("Jogador_selecionado_id", id);
				session("Jogador_selecionado_nome", usu.nome);

				return ok(usu.nome);                    
			} catch (Exception e) {
				e.printStackTrace();
			}
			return badRequest("Ocorreu algum problema no banco, o id passado não é válido");
		}else {
			return redirect(routes.Application.index());
		}
	}

	@Security.Authenticated(Seguranca.class)
	public static Result sair() {
		session().clear();
		return redirect(routes.Application.index());
	}

}
